Dépendences transitives et “unresolved requirement” error dans Liferay
Avec le passage à OSGi, la gestion du classpath ajoute son lot de surprise. Ainsi, on peut voir apparaitre l’erreur suivant lors du déploiement d’un module :
Could not resolve module: com.mbarberot.module.lorem [2008]_
Unresolved requirement: Import-Package: org.foo.utils_
Dans la plupart des cas, org.foo.utils
est le package d’une dépendance ajoutée au module. Par défaut, OSGi va aller chercher ce package dans sa liste de package qui provient des différents Export-Package
des modules déployés. Il faut donc lui signifier qu’il s’agit en fait d’un package qu’il doit aller chercher au sein de notre module. Pour cela, nous pouvons ajouter cette instruction au bnd.bnd
:
Private-Package: \
org.foo.*
Hélas, c’est alors qu’une nouvelle erreur peut survenir :
Could not resolve module: com.mbarberot.module.lorem [2008]_
Unresolved requirement: Import-Package: org.bar.annotations_
Pourtant, nulle trace de ce package dans le code ! Il s’agit en fait d’un package utilisé dans org.foo
car OSGi va venir également regarder les dépendances transitives !
Hélas, dans ce cas, ajouter le package dans Private-Package
ne fonctionnera pas car ce n’est pas notre propre code qui vient importer ce package.
Dans ce cas, on peut venir blacklister ce package dans la partie Import-Package
dans le bnd.bnd
:
Private-Package: \
org.foo.*
Import-Package: \
!org.bar.*, \
*
Attention à ne pas oublier le wildcard en dernier, sans quoi OSGi n’ira plus chercher aucun package et ne trouvera aucune classe appartenant aux dépendances “provided” : Liferay, vos autres modules, ...